package com.example.administrator.exkotlin.base

import java.util.HashSet
import kotlin.reflect.KProperty

/**
 * Author by lp,on 2020/7/23/023,16:48.
 * 委托
 * 关键字 by
 * 定义:
 * 委托分为类委托和委托属性
 * 类委托：把类的具体实现委托给另一个类完成，并可以对某些方法进行重新实现
 * class Aobj<T>(val obj:Bobj<T>) by obj {}
 * 委托属性：属性的赋值和获取由另外的实例去实现
 * var value by Delegate()
 * 其中Delegate类必须 实现 getValue和setValue方法，用于委托获取和设置value的值。
 *
 */
class Commission {
    // 创建接口
    interface Base {
        fun print()
    }

    // 实现此接口的被委托的类
    class BaseImpl(val x: Int) : Base {
        override fun print() {
            print(x)
        }
    }

    // 通过关键字 by 建立委托类
    class Derived(base: Base) : Base by base {
        var value by Delegate()
        fun test() {
            println("this is test")
        }
    }

    //属性委托类
    class Delegate {
        var propValue: Any? = null

        //myClass: T,对委托属性的类的限制， prop: KProperty<*> kotlin的属性操作类，可用于获取各种属性相关的值<*>表示不关心泛型的具体类型
        operator fun <T> getValue(myClass: T, prop: KProperty<*>): Any? {
            return propValue
        }

        operator fun <T> setValue(myClass: T, prop: KProperty<*>, value: Any?) {
            propValue = value
        }
    }

    //执行
    fun main(args: Array<String>) {
        val b = BaseImpl(10)
        val derived=Derived(b).apply {
            print()
            test()
            value="testSetValue"
        } // 输出 10
        println(derived.value)
    }

}